package com.study.mq.send;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;
import com.study.utils.ConnectionUtils;


public class SendMsg
{
    private final static String QUEUE_NAME = "queue1";
    
    public static void main(String[] args) throws IOException, TimeoutException
    {
        String msg = "hello word";
        try(Connection conn = ConnectionUtils.getConnection())
        {
            Channel channel = null;
            try
            {
                channel = conn.createChannel();
                System.out.println(channel.getChannelNumber());
                
                //创建队列(使用java代码创建队列，也可以在可视化界面创建队列)
                //name:队列名字
                //durable：队列是否持久化, 队列的声明默认是存放到内存中的，如果rabbitmq重启会丢失，如果想重启之后还存在就要使队列持久化，保存到Erlang自带的Mnesia数据库中，当rabbitmq重启之后会读取该数据库
                //exclusive：是否排外的，有两个作用，一：当连接关闭时connection.close()该队列是否会自动删除；二：该队列是否是私有的private，如果不是排外的，可以使用两个消费者都访问同一个队列，没有任何问题，如果是排外的，会对当前队列加锁，其他通道channel是不能访问的，如果强制访问会报异常：com.rabbitmq.client.ShutdownSignalException: channel error; protocol 一般等于true的话用于一个队列只能有一个消费者来消费的场景
                //autoDelete：是否自动删除队列，当最后一个消费者断开连接之后队列是否自动被删除，可以通过RabbitMQ Management，查看某个队列的消费者数量，当consumers = 0时队列就会自动删除
                
                //如果要创建的队列已经存在，则不会创建队列，当创建队列和已经存在的队列信息不一致（比如已存在的队列是需要持久化的，而通过代码创建的队列是不需要持久化），则会抛出异常ShutdownSignalException
                channel.queueDeclare(QUEUE_NAME, true, false, false, null);
                
                // 循环发布任务
                for (int i = 0; i < 50; i++) {
                    msg = "msg .. " + i;
                    
                    //参数1:交换机名称，如果不指定将使用mq的默认交换机（设置为""）
                    //参数2:目标队列名称
                    //参数3:设置当前这条消息的属性 MessageProperties.PERSISTENT_TEXT_PLAIN 持久化
                    //参数4:消息内容
                    channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes("utf-8"));
                    
                    Thread.sleep(200);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally 
            {
                if(channel != null)
                {
                    channel.close();                    
                }
            }
            
        }
    }
}
